/**
 * 格式化日期
 * @param {number|string|Date} date - 时间戳(秒)或日期对象
 * @param {string} format - 格式，默认 'YYYY/MM/DD'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY/MM/DD') {
	if (!date) return '';

	// 如果是时间戳（秒），转换为毫秒
	const d = typeof date === 'number' && date < 1e12 ? new Date(date * 1000) : new Date(date);

	// 如果日期无效，返回空字符串
	if (isNaN(d.getTime())) return '';

	const pad = n => n.toString().padStart(2, '0');

	const replacements = {
		'YYYY': d.getFullYear(),
		'MM': pad(d.getMonth() + 1),
		'DD': pad(d.getDate()),
		'HH': pad(d.getHours()),
		'mm': pad(d.getMinutes()),
		'ss': pad(d.getSeconds())
	};

	return format.replace(/(YYYY|MM|DD|HH|mm|ss)/g, match => replacements[match] || match);
}

/**
 * 获取指定类型的日期范围（本日/本周/本月）
 * @param {string} type - 日期类型：today(本日)、week(本周)、month(本月)
 * @param {Date} [customDate] - 可选：自定义基准日期（默认取当前日期）
 * @returns {Array<string>} 日期范围数组，格式 ['开始日期', '结束日期']（YYYY-MM-DD）
 * @throws {Error} 传入无效type时抛出错误
 */
export function getDateRangeByType(type, customDate = new Date()) {
	// 工具函数：日期补零（确保月/日为两位数）
	const padZero = (num) => num.toString().padStart(2, '0');

	// 复制基准日期（避免修改原日期对象）
	const baseDate = new Date(customDate);
	const year = baseDate.getFullYear();
	const month = baseDate.getMonth(); // 月份：0-11（需注意）
	const date = baseDate.getDate();

	// 根据类型计算日期范围
	switch (type.toLowerCase()) {
		// 1. 本日：开始和结束都是当天
		case 'today':
			return [
				`${year}-${padZero(month + 1)}-${padZero(date)}`,
				`${year}-${padZero(month + 1)}-${padZero(date)}`
			];

			// 2. 本周：开始（周日）- 结束（周六），可调整为周一为第一天（见注释）
		case 'week':
			// 获取当前是本周第几天（0=周日，1=周一，...，6=周六）
			const dayOfWeek = baseDate.getDay();
			// 计算本周第一天（周日）：当前日期 - (本周第几天) 天
			const weekStart = new Date(baseDate);
			weekStart.setDate(date - dayOfWeek);
			// 计算本周最后一天（周六）：本周第一天 + 6 天
			const weekEnd = new Date(weekStart);
			weekEnd.setDate(weekStart.getDate() + 6);
			// 返回格式化后的本周范围
			return [
				`${weekStart.getFullYear()}-${padZero(weekStart.getMonth() + 1)}-${padZero(weekStart.getDate())}`,
				`${weekEnd.getFullYear()}-${padZero(weekEnd.getMonth() + 1)}-${padZero(weekEnd.getDate())}`
			];

			// 3. 本月：开始（1号）- 结束（当月最后一天）
		case 'month':
			// 本月第一天（1号）
			const monthStart = new Date(year, month, 1);
			// 本月最后一天（下个月1号 - 1天）
			const monthEnd = new Date(year, month + 1, 0);
			// 返回格式化后的本月范围
			return [
				`${monthStart.getFullYear()}-${padZero(monthStart.getMonth() + 1)}-${padZero(monthStart.getDate())}`,
				`${monthEnd.getFullYear()}-${padZero(monthEnd.getMonth() + 1)}-${padZero(monthEnd.getDate())}`
			];

			// 无效类型处理
		default:
			throw new Error(`无效的日期类型：${type}，仅支持 today/week/month`);
	}
}

/**
 * 计算预期租金收益（包含总收益、每月收益和每日收益）
 * @param {number} purchasePrice - 采购价格（必填，如1000.00）
 * @param {number} userRate - 托管经营用户的收益率（百分比，如10表示10%，必填）
 * @param {number} periods - 期数（如12期，必填）
 * @param {number} [daysInYear=365] - 一年的天数，默认365天
 * @returns {Object} 包含总租金收益、每月收益和每日收益的对象（均保留两位小数）
 * @throws {Error} 当参数不合法时抛出错误
 */
export function calculateRentalIncome(purchasePrice, userRate, periods, daysInYear = 365) {
	// 参数校验
	if (typeof purchasePrice !== 'number' || purchasePrice <= 0) {
		throw new Error('采购价格必须是正数');
	}
	if (typeof userRate !== 'number' || userRate < 0) {
		throw new Error('收益率必须是非负数');
	}
	if (typeof periods !== 'number' || periods <= 0 || !Number.isInteger(periods)) {
		throw new Error('期数必须是正整数');
	}
	if (typeof daysInYear !== 'number' || daysInYear <= 0) {
		throw new Error('天数必须是正数');
	}

	// 计算总租金收益（包含本金），先保留两位小数确保精度
	const totalRentalIncome = Number((purchasePrice * (1 + userRate / 100)).toFixed(2));

	// 计算每月收益（使用精确的小数处理，确保1100÷12=91.66）
	const monthlyIncome = Number((Math.floor((totalRentalIncome / periods) * 100) / 100).toFixed(2));

	// 计算每日收益（保留两位小数）
	const dailyIncome = Number((totalRentalIncome / daysInYear).toFixed(2));

	return {
		totalRentalIncome, // 总租金收益
		monthlyIncome, // 每月收益
		dailyIncome // 每日收益
	};
}